附录1 特性符号汇总

名词解释

正则表达式

正则表达式是使用正则语法的对文本进行查找、匹配、替换的工具。

模式

模式就是我们写的正则表达式语句,每个正则表达式语句都是一个或多个模式。

元字符

元字符是正则表达式里面的关键字,大致可以分为两种:一种是用来匹配文本的(比如 . ),另一种是正则表达式的语法所要求的(比如 [] )。

字符集合

[] 组成字符集合,表示匹配 [] 之间的某个字符或字符范围。

子表达式

() 括起来的为子表达式,可以粗略的理解为编程语言里面的函数或片段。

“消费”和“不消费”

使用术语“消费”(consume)来表述“匹配和返回文本”的含义。在向前查找里,被匹配的文本不包含在最终返回的匹配结果里,这被称为“不消费”。

字符集合

字符 说明
[] 匹配 [ 和 ] 之间的字符,可以是单个字符(比如,abc 等)、字符范围(比如 a-z,A-Z,0-9 等),也可以是下面的字符类别)
. 匹配所有字符(默认情况下不匹配换行符,可使用 s 选项让点号匹配换行符)
\w 匹配数字、字母和下划线。等价于 [a-zA-Z0-9_]
\d 匹配数字。等价于 [0-9]
\p{Value} 匹配 Unicode 属性,详见 4.4 Unicode 属性转义
\xXX 匹配 16 进制字符编码 (X 取值范围为 0-F)
\0XX 匹配 8 进制字符编码 (X 取值范围为 0-7)
\uXXXX 匹配 Unicode 编码 (X 取值范围为 0-F)

Unicode 属性转义

属性 说明
\p{Emoji} 匹配 Emoji 表情
\p{Hex_Digit} 匹配 16 进制数字。等价于 [0-9a-fA-F]
\p{White_Space} 匹配空白字符。等价于下面的 \s
\p{L} 匹配字符。等价于 \w
\p{Lu} 匹配大写字符。等价于 [A-Z]
\p{Ll} 匹配小写字符。等价于 [a-z]
\p{N} 匹配数字。等价于 \d
\p{P} 标点符号(包括中文标点和全角标点)
\p{Pc} 下划线
\p{Ps} 左括号,"["、"("、"{"、"("、"「"、"【"、"〔"、"[" 等
\p{Pe} 右括号,"]"、")"、"}"、")"、"」"、"】"、"〕"、"]" 等
\p{Script=Han} 匹配中文,里面的 Han 可以换成其他语言来匹配特定语言

POSIX 字符类

用法详见4.5 使用 POSIX 字符类

字符类 说明
[:alnum:] 任何一个字母或数字(等价于 [a-zA-Z0-9]
[:alpha:] 任何一个字母(等价于 [a-zA-Z]
[:blank:] 空格或制表符等价于 [\t ]
[:cntrl:] ASCII 控制字符(ASCII 0 到 31 和 ASCII 127)
[:digit:] 任何一个数字(等价于 [0-9]
[:print:] 任何一个可打印字符
[:graph:] [:print:] 一样,但不包括空格
[:lower:] 任何一个小写字母(等价于 [a-z]
[:upper:] 任何一个大写字母(等价于 [A-Z]
[:punct:] 既不属于 [:alnum:] 也不属于 [:cntrl:] 的其他字符
[:space:] 任何一个空白字符,包括空格(等价于 [\f\n\r\t\v ]
[:xdigit:] 任何一个 16 进制数字(等价于 [a-fA-F0-9]

空白字符

元字符 说明
\f 换页符
\n 换行符
\r 回车符
\t 制表符(Tab 键)
\v 垂直制表符
\s 任何一个空白字符。等价于 [\f\n\r\t\v]
提示

在 Linux、MacOS 等类 Unix 系统中直接使用 \n 可以匹配换行。但在 Windows 中要使用 \r\n 才行。

重复匹配

下面量词可以跟在普通字符、元字符、字符集合或子表达式后面,表示它紧跟的内容的重复次数。

字符 说明
+ 匹配 1 次或多次
* 匹配 0 次或多次
? 匹配 0 次或 1 次
{n} 匹配 n 次
{n,m} 匹配 n 到 m 次
{n,} 至少匹配 n 次

子表达式

字符 说明
() ( 和 ) 之间的内容为一个子表达式,第个子表达式做为一个整体参与匹配
| | 用来分割多个子表达式内容

子表达式支持嵌套并以左括号为准来确定索引,比如下面的模式包含了 4 个子表达式,其中第 4 个子形式又包含了可选的两个匹配:

  1. 内容为 a(b(c(d|e)))
  2. 内容为 b(c(d|e))
  3. 内容为 c(d|e)
  4. 内容为 d|e
    1. 匹配 d
    2. 匹配 e
(a(b(c(d|e))))

使用子表达式索引可读性、可维护性较差,子表达式支持命名捕获。下面的模式可以使用 year, month, day 来匹配年月日,同时也可以使用 1, 2, 3 来获取。

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})

回溯引用

回溯引用也是子表达式的应用之一,它可以做到前后一致匹配。可以使用 \1 来回溯第 1 个子表达式,或者使用 \k<name> 来回溯前面名为 name 的子表达式。

操作符 说明
(a)b(\1) 匹配 aba
(a?<start>)b(\k<start>) 匹配 aba

下面的例子可以做到匹配前后一致的标题标签,详见8.2 回溯引用匹配

前后查找(零宽匹配)

前后查找也是子表达式的应用之一,它可以以某些字符做为位置信息而不消费它本身来匹配前面或后面的内容。

操作符 说明
b(?=a) 向前查找,匹配 b 和 a,但消费 b 不消费 a
(?<=a)b 向后查找,匹配 a 和 b,但消费 b 不消费 a

嵌入条件

前后查找也是子表达式的应用之一,它可以判断某个子表达式匹配成立才进行后续匹配。

操作符 说明
(a)?b(?(1)c) 当 a 匹配成功时,整体匹配 abc,否则只匹配 b
(a)?(?(?=b)bc) 当 b 向前查找匹配成功时,整体匹配 abc,否则只匹配 a

取非匹配

操作符 说明
^ 对字符集合进行取非,[^a-z] 意为不匹配 a 到 z
\W \w 取非
\D \d 取非
\S \s 取非
\P \p 取非
(?!) 对向前查找取非
(?<!) 对向后查找取非

问号的用法

?

问号直接跟在字符、元字符、字符类、字符集合、子表达式后面时,表示它紧跟着的内容匹配 0 次或 1 次

(?<name>)

问号跟在 "(" 后面且问号后面有 "<>" 括起来的内容时,表示给子表达式命名。

(?=a)

问号跟在 "(" 后面且问号后面有一个等号时,表示这个子表达式是一个向前查找。

(?!a)

问号跟在 "(" 后面且问号后面有一个叹号时,表示这个子表达式是一个负向向前查找。

(?<=a)

问号跟在 "(" 后面且问号后面有一个小于号和等号时,表示这个子表达式是一个向后查找。

(?<!a)

问号跟在 "(" 后面且问号后面有一个小于号和叹号时,表示这个子表达式是一个负向向后查找。

(?(1))

问号跟在 "(" 后面且问号后面有一个括号括起来的数字时,表示这是一个嵌入的回溯条件。

(?(?=a))

问号跟在 "(" 后面且问号后面有一个括号括起来的向前查找时,表示这是一个嵌入的向前查找条件。


未完待续

发表评论